// ==UserScript==
// @name         名师网审核助手
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  在名师网后台审核时显示常见问题列表，方便快速录入
// @author       zjlester
// @match        https://ms.zjer.cn/index.php?r=studio/admin*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 防重复执行标记
    const SCRIPT_EXECUTED_FLAG = 'ms-review-helper-executed';
    
    /**
     * 审核不通过理由数据维护
     */
    const ReviewReasons = {
        liveList: [//直播审核
            '直播主题宽泛，建议聚焦教育教学、教师发展中的小切口问题，标题有新意与吸引力',
            '“名师面对面”、“名师带你学”中名师须是主讲人或主讲人之一；学科带头人直播可选“携手乡村名师课堂”',
            '内容不完整：活动介绍须包括“直播背景与意义”“拟解决的问题”“活动环节安排”；主讲人、嘉宾须有个人简介；建议上传活动资源（确有困难，在活动完成上补充）',
        ],
        
        noticeList: [//公告审核
            '公告标题不明确，无法准确反映公告内容',
            '公告内容不完整，缺少关键信息',
            '正文段落中不重复出现标题',
            '格式不规范，排版错乱，网站中表格显示效果不佳，建议截图上传，图片单独成段并居中对齐。建议提交后自行点击浏览查看效果，如显示不佳，建议修改再报送。',
            '报送公告中的内容不符合平台定位，应以工作室重要活动或事项的通知为主。其它主题的不需要报送，发布后直接在工作室网站即可查看',
            '不建议自编文号，确有需求标记可用活动序数表示，如：2025学年第X次送教活动',
             '工作室称谓不正确，应为“浙江省XX名师网络工作室”、“XX名师网络工作室”或“XX工作室”，不使用“XX名师工作室”、“XX网络名师工作室”；',
            `请参照此模板编辑内容：https://ms.zjer.cn/index.php?r=studio/workstation/noticedetails&id=18741&wid=27`
        ],
        
        newsList: [//资讯审核
            '资讯标题不明确，无法准确反映内容主题，建议体现工作室、事项主题',
            '工作室称谓不正确，应为“浙江省XX名师网络工作室”、“XX名师网络工作室”或“XX工作室”，不使用“XX名师工作室”、“XX网络名师工作室”；',
            '正文中不重复标题',
            '资讯内容质量不高，缺乏实质性信息',
            '格式不规范或排版错乱，网站中表格显示效果不佳，建议截图上传，图片单独成段并居中对齐。建议提交后自行点击浏览查看效果，如显示不佳，建议修改再报送。',
            '资讯内容不符合平台定位，应以介绍工作室建设运行的重要事项等为主',
            '外链图片无法显示，请上传图片',
        ],
        
        resourceList: [//专题名称审核
            '专题名称须修改，要反应学段学科及内容主题，如：小学高段写作教学专题',
            '专题资源须工作室原创，不能以转载资源为主体',
            '专题中具体资源标题不规范，要体现专题内容及呈现一定的顺序结构',
            '专题资源缺乏教育价值，不符合平台定位'
            ]
    };

    /**
     * 页面类型与理由数据映射
     */
    const PageTypeMapping = {
        'r=studio/admin/livelist': 'liveList',
        'r=studio/admin/noticelist': 'noticeList',
        'r=studio/admin/newslist': 'newsList',
        'r=studio/admin/restopicsclass': 'resourceList',
    };

    /**
     * 页面类型配置
     */
    const PageTypeConfig = {
        liveList: { targetText: '点击选择', mode: 'replace' },
        noticeList: { targetText: '不推送理由', mode: 'insert' },
        newsList: { targetText: '不推送理由', mode: 'insert' },
        resourceList: { targetText: '点击选择', mode: 'replace' }
    };

    // 添加样式到页面
    function addStyles() {
        const style = document.createElement('style');
        style.textContent = `
            .review-reason-container {
                max-height: 350px;
                overflow-y: auto;
                border: 1px solid #9fa3a6ff;
                border-radius: 6px;
                padding: 4px;
                margin-top: 4px;
                box-shadow: 0 2px 8px rgba(24, 144, 255, 0.1);
            }
            
            .review-reason-title {
                font-size: 14px;
                font-weight: bold;
                margin-bottom: 2px;
                color: #096dd9;
                padding-bottom: 2px;
                text-align: center;
            }
            
            .review-reason-item {
                cursor: pointer;
                line-height: 1.4;
                font-size: 13px;
                margin: 4px 0;
                padding: 4px 8px;
                border-radius: 4px;
                background-color: #e6f7ff;
                border: 1px solid #91d5ff;
                transition: all 0.2s;
                user-select: none;
                color: #010a17ff;
                font-weight: 500;
            }
            
            .review-reason-item:hover {
                background-color: #bae7ff;
                border-color: #40a9ff;
                box-shadow: 0 2px 8px rgba(0,0,0,0.15);
                transform: translateY(-1px);
            }

            .review-reason-feedback {
                background-color: #d9f7be !important;
            }
        `;
        document.head.appendChild(style);
    }

    // 主函数 - 根据当前页面URL初始化相应功能
    function init() {
        if (window[SCRIPT_EXECUTED_FLAG]) {
            console.log('名师网审核助手：脚本已执行，跳过重复执行');
            return;
        }
        window[SCRIPT_EXECUTED_FLAG] = true;
        
        addStyles();
        
        const currentUrl = window.location.href;
        let pageType = null;
        
        for (const [urlPattern, type] of Object.entries(PageTypeMapping)) {
            if (currentUrl.includes(urlPattern)) {
                pageType = type;
                console.log(`名师网审核助手：检测到${type}页面`);
                break;
            }
        }
        
        if (pageType) {
            initReviewPage(pageType);
        } else {
            console.log('名师网审核助手：未匹配到特定页面');
        }
    }

    /**
     * 初始化审核页面功能
     * @param {string} pageType - 页面类型
     */
    function initReviewPage(pageType) {
        console.log(`名师网审核助手：开始初始化${pageType}审核功能`);
        
        const observer = new MutationObserver(function(mutations) {
            for (const mutation of mutations) {
                for (const node of mutation.addedNodes) {
                    if (node.nodeType === 1) {
                        const hasDialog = node.classList && node.classList.contains('d-outer') || 
                                         (node.querySelectorAll && node.querySelectorAll('.d-outer').length > 0);
                        
                        if (hasDialog) {
                            console.log(`名师网审核助手：检测到审核对话框出现`);
                            setTimeout(() => {
                                const dialogInfo = findReviewDialog();
                                if (dialogInfo) {
                                    routeReviewFunction(pageType, dialogInfo);
                                }
                            }, 500);
                            break;
                        }
                    }
                }
            }
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true
        });

        console.log(`${pageType}审核功能已初始化`);
    }

    /**
     * 查找审核对话框元素
     * @returns {Object|null} 包含对话框和内容区域的对象
     */
    function findReviewDialog() {
        let dialog = document.querySelector('.d-outer');
        if (!dialog) {
            const dialogs = document.querySelectorAll('.d-outer');
            if (dialogs.length > 0) dialog = dialogs[0];
            else return null;
        }
        
        let dialogContent = dialog.querySelector('.d-content');
        if (!dialogContent) {
            const contents = dialog.querySelectorAll('.d-content');
            if (contents.length > 0) dialogContent = contents[0];
            else return null;
        }
        
        let shBack = dialogContent.querySelector('#sh_back');
        if (!shBack) {
            const shBacks = dialogContent.querySelectorAll('#sh_back');
            if (shBacks.length > 0) shBack = shBacks[0];
            else return null;
        }
        
        return { dialog, dialogContent, shBack };
    }

    /**
     * 路由功能 - 根据不同的页面类型，加载不同的理由列表
     * @param {string} pageType - 页面类型
     * @param {Object} dialogInfo - 对话框信息
     */
    function routeReviewFunction(pageType, dialogInfo) {
        console.log('名师网审核助手：执行路由函数，页面类型:', pageType);
        
        const reasons = ReviewReasons[pageType];
        if (!reasons) {
            console.log('名师网审核助手：未找到对应页面类型的审核理由');
            return;
        }
        
        const { dialogContent } = dialogInfo;
        
        if (dialogContent.querySelector('.review-reason-container')) {
            console.log('名师网审核助手：理由容器已存在，跳过添加');
            return;
        }
        
        const config = PageTypeConfig[pageType];
        if (config) {
            addReasonsToDialog(reasons, config, dialogInfo);
        } else {
            console.log('名师网审核助手：未匹配到处理函数，页面类型:', pageType);
        }
    }

    /**
     * 创建容器元素
     * @param {Array} reasons - 审核理由数组
     * @param {Object} dialogInfo - 对话框信息
     * @returns {HTMLElement} 容器元素
     */
    function createReasonsContainer(reasons, dialogInfo) {
        const container = document.createElement('div');
        container.className = 'review-reason-container';
        
        const title = document.createElement('div');
        title.textContent = '常用不通过理由（点击添加）:';
        title.className = 'review-reason-title';
        
        reasons.forEach((reason) => {
            const p = document.createElement('p');
            p.textContent = reason;
            p.className = 'review-reason-item';
            p.addEventListener('click', () => handleReasonClick(reason, p, dialogInfo));
            container.appendChild(p);
        });
        
        const wrapper = document.createElement('div');
        wrapper.appendChild(title);
        wrapper.appendChild(container);
        
        return wrapper;
    }

    /**
     * 添加理由到对话框
     * @param {Array} reasons - 审核理由数组
     * @param {Object} config - 页面配置
     * @param {Object} dialogInfo - 对话框信息
     */
    function addReasonsToDialog(reasons, config, dialogInfo) {
        const { dialogContent } = dialogInfo;
        const { targetText, mode } = config;
        
        const targetTd = Array.from(dialogContent.querySelectorAll('td')).find(td => 
            td.textContent.trim() === targetText
        );
        
        if (!targetTd) {
            console.log('名师网审核助手：未找到目标单元格:', targetText);
            return;
        }
        
        const container = createReasonsContainer(reasons, dialogInfo);
        
        if (mode === 'replace') {
            const nextTd = targetTd.nextElementSibling;
            if (nextTd) {
                nextTd.innerHTML = '';
                nextTd.appendChild(container);
                console.log('名师网审核助手：已成功添加审核理由');
            }
        } else if (mode === 'insert') {
            const targetRow = targetTd.closest('tr');
            if (targetRow) {
                const newRow = document.createElement('tr');
                const firstCell = document.createElement('td');
                const secondCell = document.createElement('td');
                
                firstCell.style.verticalAlign = 'top';
                firstCell.style.fontSize = '18px';
                firstCell.style.paddingRight = '20px';
                
                secondCell.appendChild(container);
                newRow.appendChild(firstCell);
                newRow.appendChild(secondCell);
                
                targetRow.parentNode.insertBefore(newRow, targetRow.nextSibling);
                console.log('名师网审核助手：已成功添加审核理由列表');
            }
        }
    }

    /**
     * 点击理由列表中的某一项，添加到文本框中
     * @param {string} reasonText - 理由文本
     * @param {HTMLElement} reasonElement - 理由元素
     * @param {Object} dialogInfo - 对话框信息
     */
    function handleReasonClick(reasonText, reasonElement, dialogInfo) {
        const { dialogContent } = dialogInfo;
        const textarea = dialogContent.querySelector('#addreason');
        
        if (textarea) {
            const separator = textarea.value.length > 0 ? '\n' : '';
            textarea.value += separator + reasonText;
            textarea.scrollTop = textarea.scrollHeight;
            
            // 添加视觉反馈
            reasonElement.classList.add('review-reason-feedback');
            setTimeout(() => {
                reasonElement.classList.remove('review-reason-feedback');
            }, 400);
        }
    }

    // 页面加载完成后初始化
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();